package leetcode.程序员面试;

import java.math.BigInteger;
import java.util.HashSet;
import java.util.Set;

/**
 * Created With IntelliJ IDEA.
 * Descriptions:给定一个字符串，编写一个函数判定其是否为某个回文串的排列之一。
 *
 * 回文串是指正反两个方向都一样的单词或短语。排列是指字母的重新排列。
 *
 * 回文串不一定是字典当中的单词。
 *
 *
 *
 * 示例1：
 *
 * 输入："tactcoa"
 * 输出：true（排列有"tacocat"、"atcocta"，等等）
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/palindrome-permutation-lcci
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 * User:Mr.Du
 * Date:2020/12/17
 * Time:21:52
 */
public class CanPermutePalindrome04 {

    public static void main(String[] args) {
        Set<Integer> set = new HashSet<>();
        System.out.println(set.add(1));
        System.out.println(set.add(1));
        System.out.println(canPermutePalindrome3("AaBb//abA"));
    }

    public static boolean canPermutePalindrome1(String s){
        int[] arr = new int[255];
        int count = 0;
        for(int i = 0;i<s.length();i++){
            arr[s.charAt(i) - (char)0]++;
        }
        for(int i = 0;i < 255;i++){
            if(arr[i]%2 != 0){
                count++;
            }
        }
        return count < 2;
    }

    public static boolean canPermutePalindrome2(String s){
        Set<Character> set = new HashSet<>();
        for(int i = 0;i<s.length();i++){
            if(!set.add(s.charAt(i))){
                set.remove(s.charAt(i));
            }else {
                set.add(s.charAt(i));
            }
        }
        return set.size()<2;
    }


    public static boolean canPermutePalindrome3(String s){
        BigInteger result = new BigInteger("0");
        for(int i = 0;i<s.length();i++){
            result = result.xor(new BigInteger("1").shiftLeft(s.charAt(i)));
        }
        return result.and(result.subtract(new BigInteger("1"))).toString().equals("0");
    }



}
